import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
import { parseBigInt } from 'jsencrypt/lib/lib/jsbn/jsbn'

function pkcs1unpad2 (d) {
  var b = d.toByteArray()
  var i = 0
  while (i < b.length && b[i] === 0) {
    ++i
  }
  // if (b.length - i !== n - 1 || b[i] !== 2) {
  //   return null
  // }
  ++i
  while (b[i] !== 0) {
    if (++i >= b.length) {
      return null
    }
  }
  var ret = ''
  while (++i < b.length) {
    var c = b[i] & 255
    if (c < 128) { // utf-8 decode
      ret += String.fromCharCode(c)
    } else if ((c > 191) && (c < 224)) {
      ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63))
      ++i
    } else {
      ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63))
      i += 2
    }
  }
  return ret
}

export function decrypt (data, publicKey) {
  const encrypt = new JSEncrypt()
  encrypt.setPublicKey(publicKey)
  // 不支持公钥解密
  // 自定义解析方法支持公钥解析
  const rsaKey = encrypt.getKey()
  //
  rsaKey.decrypt = function (ctext) {
    var c = parseBigInt(ctext, 16)
    var m = this.doPublic(c)
    if (m == null) {
      return ''
    }
    const o = pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3)
    return o === null ? '' : o
  }
  return encrypt.decrypt(data) || ''
}
